package demo10.WaitAndNotify;
/*
* 等待唤醒案例
*       创建一个线程，是消费者，调用wait方法进行等待，等待老板吧包子做好，进入无限等待阶段Waitting
*       创建一个线程，是生产者，调用sleep方法沉睡5秒（做包子的时间），老板做好包子之后叫顾客吃包子
* 注意
*       1.必须用同步代码块，唤醒和等待只能有一个同时进行
*       2.锁对象必须唯一
*       3.锁对象才能调用wait和notify方法*/
public class Demo01WaitAndNotify {
    public static void main(String[] args) {
        Object obj=new Object();
        //创建一个线程
        new Thread(){
            @Override
            public void run() {

                synchronized (obj){
                    try {
                        System.out.println("顾客正在等待老板做包子");
                        obj.wait(1000);

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("顾客被叫来吃包子了");
                    System.out.println("---------------------");
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                synchronized (obj){
                    try {
                        System.out.println("老板正在等5秒做包子");
                        sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("老板包子做好了，叫顾客吃包子");
                    obj.notify();
                    System.out.println("老板叫了");
                }
            }
        }.start();

        for (int i = 0; i < 20; i++) {
            System.out.println("这是主线程："+i);
        }
    }

}
